void Median (ImSize, WinSize, InIm, OutIm)
int  ImSize, WinSize;
BYTE ** InIm;
BYTE ** OutIm;
{
   int   r,c, y,x, i,j, n, Area;
   BYTE  Buf;
   BYTE  *Lst;

   n = (WinSize-1) >> 1;
   Area = (2*n+1) * (2*n+1);
   Lst = (BYTE *) malloc (Area*sizeof(BYTE));

   for (r=0; r<ImSize; r++)
      for (c=0; c<ImSize; c++)  OutIm [r][c] = 0;

   for (r=n; r<ImSize-n; r++) {
      for (c=n; c<ImSize-n; c++) {
         i=0;
         for (y=-n; y<=n; y++) {
            for (x=-n; x<=n; x++) {
               Lst [i] = InIm [r+y] [c+x];
               i++;
         }  }

         for (i=0; i<Area-1; i++)   /**** bubble sort ****/
            for (j=Area-1; i<j; j--)
               if (Lst[j-1] > Lst[j]) {
                  Buf      = Lst[j-1];
                  Lst[j-1] = Lst[j];
                  Lst[j]   = Buf;
               }
               OutIm [r][c] = Lst [Area/2];
}  }  }
